/**
 * 询价.COM v1.0.0
 * http://xun-jia.com/
 *
 * Copyright (c) 2009 
 * 四川漾天空网络科技有限公司
 * 成都市天府软件园A2栋3楼
 *
 */
package com.songtai.util;

import java.io.Serializable;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author michael
 * 
 * @Email michael_zhao@xun-jia.com
 * 
 * @Date 2009-4-23 下午03:35:37
 * 
 */
public class DateUtils implements Serializable {

	private static final long serialVersionUID = -3652465511156989915L;

	/**
	 * 获取指定日期的指定格式的字符串表示
	 * 
	 * @param date
	 * @param format
	 *            默认格式为:yyyy-MM-dd HH:mm:ss
	 * @return
	 */
	public static String getDateString(Date date, String format) {
		if (date == null)
			return null;
		if (null == format || format.trim() == "")
			format = Constants.DATEFORMAT_YYYY_MM_DD_HH_MM_SS;
		// 日期模式
		DateFormat df = new SimpleDateFormat(format);
		// 返回
		return df.format(date);
	}

	public static String getDateFromStringToString(String str, String formate1, String formate2) throws ParseException {
		if (str == null) {
			return null;
		}
		if (null == formate1 || formate1.trim() == "") {
			formate1 = Constants.DATEFORMAT_YYYY_MM_DD_HH_MM_SS;
		}
		if (null == formate2 || formate2.trim() == "") {
			formate2 = Constants.DATEFORMAT_YYYY_MM_DD_TITLED;
		}
		DateFormat df1 = new SimpleDateFormat(formate1);
		DateFormat df2 = new SimpleDateFormat(formate2);
		return df2.format(df1.parse(str));
	}

	/**
	 * 获取指定字符串日期的Date格式
	 * 
	 * @param date
	 * @param format默认格式为
	 *            :yyyy-MM-dd
	 * @return
	 */
	public static Date getDate(String date, String format) {
		try {
			if (null == date || date.trim() == "")
				return null;
			if (null == format || format.trim() == "") {
				format = Constants.DATEFORMAT_YYYY_MM_DD_ACROSS;
			}
			// 日期模式
			DateFormat df = new SimpleDateFormat(format);
			// 返回
			return df.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 将日期格式化指定格式
	 * 
	 * @param date
	 * @param format
	 *            默认格式:yyyy-MM-dd
	 * @return
	 */
	public static Date formatDate(Date date, String format) {
		if (null == format || format.trim() == "") {
			format = Constants.DATEFORMAT_YYYY_MM_DD_ACROSS;
		}
		return getDate(getDateString(date, format), format);
	}

	/**
	 * 将日期格式化指定格式
	 * 
	 * @param date
	 * @param format
	 *            默认格式:yyyy-MM-dd
	 * @return
	 */
	public static String getDateString(String date, String format, String toFormat) {
		if (null == format || format.trim() == "") {
			format = Constants.DATEFORMAT_YYYY_MM_DD_TITLED;
		}
		return getDateString(getDate(date, format), toFormat);
	}

	/**
	 * 返回两日期之间相关的天数 (如果存在日期为NULL,返回-1)
	 * 
	 * @param begin
	 * @param end
	 * @return
	 */
	public static int getIntervalDays(Date begin, Date end) {
		// 如果两者之中的任意一个为空,返回-1
		if (begin == null || end == null) {
			return -1;
		}
		// 如果开始日期在结束日期之后,交换二者位置;
		if (begin.after(end)) {
			// 临时日期,指向开始日期
			Date temp = begin;
			// 开始日期->结束日期
			begin = end;
			// 结束日期->开始日期
			end = temp;
		}
		// 开始日期
		Calendar beginDate = Calendar.getInstance();
		// 转换为只有日期,没有时间的日期值
		begin = formatDate(begin, Constants.DATEFORMAT_YYYY_MM_DD_ACROSS);
		// 设置当前Calendar(beginDate)的日期
		beginDate.setTime(begin);
		// 结果日期
		Calendar endDate = Calendar.getInstance();
		// 转换为只有日期,没有时间的日期值
		end = formatDate(end, Constants.DATEFORMAT_YYYY_MM_DD_ACROSS);
		// 设置当前Calendar(endDate)的日期
		endDate.setTime(end);
		/*
		 * int beginDateOfYear = beginDate.get(Calendar.YEAR); int endDateOfYear
		 * = beginDate.get(Calendar.YEAR); // 跨年 int years = endDateOfYear -
		 * beginDateOfYear;
		 * 
		 * if (years > 0) {
		 * 
		 * } else { days = endDate.get(Calendar.DAY_OF_YEAR) -
		 * beginDate.get(Calendar.DAY_OF_YEAR); }
		 */
		// 二者之间相差毫秒数
		long timemills = endDate.getTimeInMillis() - beginDate.getTimeInMillis();
		// 返回相差毫秒数除以一天的毫秒数
		return (int) (timemills / (1000 * 60 * 60 * 24));
	}

	// 獲取Sql查詢參數中的開始時間
	public static Date getSqlStartDate(String satrtDate, String format) {
		Date result = getDate(satrtDate, format);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(result);
		calendar.set(Calendar.HOUR, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		return calendar.getTime();
	}

	// 獲取Sql查詢參數中的結束時間
	public static Date getSqlEndDate(String endDate, String format) {
		Date result = getDate(endDate, format);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(result);
		calendar.set(Calendar.HOUR, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		return calendar.getTime();
	}

}
